package com.lois.utils;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.lois.model.UploadData;
import lombok.extern.slf4j.Slf4j;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

@Slf4j
public class UploadUtils {

    /**
     * 简单读-写法1
     */
    public static void test1(InputStream file, Class head, ReadListener readListener) {
        // 写法1：
//        String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
        // 这里 需要指定读用哪个class去读，然后读取第一个sheet 文件流会自动关闭
//        EasyExcel.read(fileName, UploadData.class, new UploadDataListener(uploadDAO)).sheet().doRead();
        EasyExcel.read(file, head, readListener).sheet().headRowNumber(1).doRead();
    }


    /**
     * 简单读-写法2
     */
    public static void test2(InputStream file, Class head, ReadListener readListener) {
        // 写法2：
//        fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
//        ExcelReader excelReader = EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).build();
        ExcelReader excelReader = EasyExcel.read(file, head, readListener).build();
        ReadSheet readSheet = EasyExcel.readSheet(0).build();
        excelReader.read(readSheet);
        // 这里千万别忘记关闭，读的时候会创建临时文件，到时磁盘会崩的
        excelReader.finish();
    }

    /**
     * 读多个sheet-readAll
     */
    public static void test3(InputStream file, Class head, ReadListener readListener) {
//        String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
        // 读取全部sheet
        // 这里需要注意 DemoDataListener的doAfterAllAnalysed 会在每个sheet读取完毕后调用一次。然后所有sheet都会往同一个DemoDataListener里面写
//        EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).doReadAll();
        EasyExcel.read(file, head, readListener).doReadAll();
    }

    /**
     * 读多个sheet-部分sheet
     */
    public static void test4(InputStream file, Class head, ReadListener readListener) {
        // 读取部分sheet
//        fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
//        ExcelReader excelReader = EasyExcel.read(fileName).build();
        ExcelReader excelReader = EasyExcel.read(file).build();
        // 这里为了简单 所以注册了同样的head和Listener 自己使用功能必须不同的Listener
        ReadSheet readSheet1 =
                EasyExcel.readSheet(0).head(head).registerReadListener(readListener).build();
        ReadSheet readSheet2 =
                EasyExcel.readSheet(1).head(head).registerReadListener(readListener).build();
        // 这里注意 一定要把sheet1 sheet2 一起传进去，不然有个问题就是03版的excel 会读取多次，浪费性能
        excelReader.read(readSheet1, readSheet2);
        // 这里千万别忘记关闭，读的时候会创建临时文件，到时磁盘会崩的
        excelReader.finish();
    }

    /**
     * 多行头
     */
    public static void test5(InputStream file, Class head, ReadListener readListener) {
//        String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
        // 这里 需要指定读用哪个class去读，然后读取第一个sheet
        EasyExcel.read(file, head, readListener).sheet()
                // 这里可以设置1，因为头就是一行。如果多行头，可以设置其他值。不传入也可以，因为默认会根据DemoData 来解析，他没有指定头，也就是默认1行
                .headRowNumber(2).doRead();
    }

    /**
     * 同步的返回，不推荐使用，如果数据量大会把数据放到内存里面
     */
    public static void test6(InputStream file, Class head) {
//        String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
        // 这里 需要指定读用哪个class去读，然后读取第一个sheet 同步读取会自动finish
        List<UploadData> list = EasyExcel.read(file).head(head).sheet().doReadSync();
        for (UploadData data : list) {
            log.info("读取到数据:{}", data);
        }

        // 这里 也可以不指定class，返回一个list，然后读取第一个sheet 同步读取会自动finish
        List<Map<Integer, String>> listMap = EasyExcel.read(file).sheet().doReadSync();
        for (Map<Integer, String> data : listMap) {
            // 返回每条数据的键值对 表示所在的列 和所在列的值
            log.info("读取到数据:{}", data);
        }
    }

}
